#pragma pack(1)

#ifndef SERIAL_LINE_IP_H
#define SERIAL_LINE_IP_H
#include <stdio.h>
#include <stdint.h> /* uint8_t */
#include <assert.h> /* assert */
#include <vector>   /* vector */
#include <stdio.h>

enum CtrlType
{
	SYNC_STAMP,		//同步时间戳
	DATA_TRANSMIT,	//数据传输
	BUILD_TABLE,
	RECV_CONFIRM,
	OPTION_SETTING,
	HEART_BEAT
};


struct SerialStruct
{
	uint8_t ctrl_byte;	//选项为CtrlType
	uint32_t time_id_status;
};

namespace SerialLineIP
{
/* SLIP special character codes */
const uint8_t END = 0xC0;     /* indicates end of packet */
const uint8_t ESC = 0xDB;     /* indicates byte stuffing */
const uint8_t ESC_END = 0xDC; /* ESC ESC_END means END data byte */
const uint8_t ESC_ESC = 0xDD; /* ESC ESC_ESC means ESC data byte */

/**
 * @brief Serial Line IP PACK
 * @param p_PDU 起始位置指针
 * @param PDU_len PDU 字节长度
 * @return std::vector<uint8_t> SDU
 * @note Service Data Unit (SDU) 指本层封包后产生的数据单元
 *       Protocol Data Unit (PDU) 指上层协议数据单元
 */
std::vector<uint8_t> Pack(const void *const p_PDU, int PDU_len);

/**
 * @brief Serial Line IP UNPACK
 * @param p_SDU 起始位置指针
 * @param SDU_len SDU 字节长度
 * @return std::vector<uint8_t> PDU
 * @note Service Data Unit (SDU) 指本层解包前的数据单元
 *       Protocol Data Unit (PDU) 指上层协议数据单元
 */
std::vector<uint8_t> Unpack(const void *const p_SDU, int SDU_len);
} // namespace SerialLineIP
#endif // SERIAL_LINE_IP_H